home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / GOODIE.ZIP / GOODIE.C next >
Text File  |  1994-12-15  |  27KB  |  1,112 lines

  1. /***************************************************************************
  2.     Kompletan source igre Corny. Sva grafika je podrzana s XLIB 5.0 cije ime
  3.     mora biti u .prj fileu. Grafika za igru su RLE kompresirane slike i
  4.     seditor kompatibilni spriteovi.
  5.  
  6.     Zadnja promjena 15.12.1994.
  7. ***************************************************************************/
  8.  
  9.  
  10. #include <string.h>
  11. #include <mem.h>
  12. #include <stdlib.h>
  13. #include <conio.h>
  14. #include <dos.h>
  15. #include <stdio.h>
  16. #include <alloc.h>
  17.  
  18. #include "xlib.h"
  19. #include "xline.h"
  20. #include "xtext.h"
  21. #include "xpbitmap.h"
  22. #include "xcbitmap.h"
  23. #include "xfileio.h"
  24. #include "xrletool.h"
  25. #include "xrect.h"
  26. #include "xpal.h"
  27.  
  28. #define NrLevels 12
  29.  
  30. typedef struct
  31. {
  32.     int x, y, xoth, yoth, newx, newy;
  33.     BYTE duz, vis;
  34.     char far *sbmp;
  35.     BYTE far *back;
  36.     BYTE far *both;
  37.     BYTE visible;
  38. } sprite;
  39.  
  40. typedef struct
  41. {
  42.     char name [ 20 ];
  43.     long hisc;
  44.     int l;
  45. } filedscore;
  46.  
  47. void interrupt (*old09) ( void );
  48. void interrupt (*oldtimer ) ( void );
  49.  
  50. char *lvlbkgs [ NrLevels ] = { "lvl1.bkg", "lvl2.bkg", "lvl3.bkg", "lvl4.bkg",
  51.                                                              "lvl5.bkg", "lvl6.bkg", "lvl7.bkg", "lvl8.bkg",
  52.                                                              "lvl9.bkg", "lvl10.bkg", "lvl11.bkg", "lvl12.bkg" };
  53. char *lvlnames [ NrLevels ] = { "By the sea", "On the beach", "Last glance at the sea",
  54.                                                                 "On the road again ...", "Waiting for the bus",
  55.                                                                 "At the airport", "St. Mark's Church",
  56.                                                                 "The Lotrscak Tower", "Banski Dvori", "Finally home",
  57.                                                                 "Lights of Zagreb", "Just pick 'em" };
  58. char credits [ 145 ] = "Programming: Tin Blaskovic     Graphics: Jasna & Tin Blaskovic     Special thanks: Davor Krivdic, Themie Gouthas       Long live me! Seeya.";
  59. sprite sprites [ 10 ];
  60. filedscore hiscores [ 10 ];
  61. char far *sbmps [ 15 ];
  62. int levelsprites [ 8 ] = { 9, 8, 10, 11, 12, 13, 5, 14 };
  63. BYTE as [ 7 ] = { 10, 11, 12, 13, 14, 15, 16 };
  64. BYTE jaws [ 7 ] = { 0, 0, 0, 0, 0, 0, 0 };
  65. BYTE uzorak [ 16 ] = { 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35 };
  66. char far *varswisl;
  67. BYTE far *background, far *titlescr;
  68. BYTE far *pal1, far *pal2, far *pal3;
  69.  
  70. int cornyx = 95, cornyy = 170;
  71.  
  72. int birdiex1 = 5, birdiey1 = 20;
  73. int birdiespt1 = 3;
  74. int birdiedir1 = 0;
  75. int birdiecount1 = 0;
  76. int vdir1 = 1;
  77.  
  78. int birdiex2 = 100, birdiey2 = 1;
  79. int birdiespt2 = 3;
  80. int birdiedir2 = 3;
  81. int birdiecount2 = 0;
  82. int vdir2 = 0;
  83.  
  84. int *inprogress = NULL, *request = NULL;
  85. int soundidx, pauseidx;
  86. int pausecount, soundsplayed, nrsounds;
  87. int catch [ 5 ] = { 1, 0, 100, 1, 110 };
  88. int fall [ 5 ] = { 1, 0, 50, 1, 25 };
  89. int endlevel [ 29 ] = { 13, 1, 52, 1, 59, 1, 66, 1, 52, 1, 52, 1, 59, 1, 66, 1, 52,
  90.                                                 1, 66, 1, 70, 2, 78, 1, 66, 1, 70, 2, 78 };
  91. int lostlife [ 15 ] = { 6, 1, 39, 0, 44, 1, 39, 1, 35, 1, 33, 1, 35, 1, 39 };
  92.  
  93. BYTE gameend;
  94. int delaytime;
  95. int lives = 3;
  96. long score = 0;
  97. int scoredec = 0;
  98. int consec = 0;
  99. int levelparcels = 0;
  100. int levelnorm;
  101. int level = 1;
  102. int lvlprob = 250;
  103. int active;
  104. int levelactive;
  105. int smjer, sz;
  106. int palettesteps;
  107. int levelgoody, levelbady;
  108. BYTE intensity;
  109. int far *keybuffb, far *keybuffe;
  110. BYTE ESC = 0, RIGHT = 0, LEFT = 0, ENTER = 0, xsz, ysz;
  111.  
  112. void Fade_Out_Palette ( void )
  113. {
  114.     palettesteps = 0;
  115.     intensity = 255;
  116.     while ( x_cpcontrast_pal_struc ( pal1, pal2, intensity -- ) )
  117.     {
  118.         x_put_pal_struc ( pal2 );
  119.         palettesteps ++ ;
  120.     }
  121. }
  122.  
  123. void Fade_In_Palette ( void )
  124. {
  125.     int j;
  126.  
  127.     for ( j = 0 ; j < palettesteps ; j ++ )
  128.     {
  129.         x_cpcontrast_pal_struc ( pal1, pal2, intensity ++ );
  130.         x_put_pal_struc ( pal2 );
  131.     }
  132. }
  133.  
  134. void Terminate ( int exitcode )
  135. {
  136.     if ( exitcode == 1 )
  137.     {
  138.         x_text_mode ( );
  139.         printf ( "File I/O error.\n" );
  140.         exit ( 1 );
  141.     }
  142.     else
  143.     {
  144.         x_text_mode ( );
  145.         printf ( "Insufficient memory.\n" );
  146.         exit ( 2 );
  147.     }
  148. }
  149.  
  150. int collided ( int s )
  151. {
  152.     if ( abs ( sprites [ s ].x - cornyx ) < 8 && sprites [ s ].y > 155 && \
  153.                          sprites [ s ].y < 195 )
  154.         return 1;
  155.     return 0;
  156. }
  157.  
  158. void initsprites ( void )
  159. {
  160.     int i;
  161.  
  162.     for ( i = 0 ; i < 10 ; i ++ )
  163.         sprites [ i ].visible = 0;
  164. }
  165.  
  166. void closesprites ( void )
  167. {
  168.     int i;
  169.  
  170.     for ( i = 0 ; i < 10 ; i ++ )
  171.         if ( sprites [ i ].visible )
  172.         {
  173.             farfree ( sprites [ i ].back );
  174.             farfree ( sprites [ i ].both );
  175.         }
  176. }
  177.  
  178. void assignsprite ( int spriteid, char far *bitmap )
  179. {
  180.     sprites [ spriteid ].sbmp = bitmap + 2;
  181.     sprites [ spriteid ].duz = *bitmap;
  182.     sprites [ spriteid ].vis = *(bitmap + 1);
  183. }
  184.  
  185. int movesprites ( void )
  186. {
  187.     int i;
  188.     BYTE far *helpptr;
  189.  
  190.     for ( i = 9 ; i >= 0 ; i -- )
  191.         if ( sprites [ i ].visible )
  192.         {
  193.             x_put_pbm ( sprites [ i ].xoth, sprites [ i ].yoth, HiddenPageOffs,\
  194.                                     sprites [ i ].both );
  195.             sprites [ i ].xoth = sprites [ i ].x;
  196.             sprites [ i ].yoth = sprites [ i ].y;
  197.             sprites [ i ].x = sprites [ i ].newx;
  198.             sprites [ i ].y = sprites [ i ].newy;
  199.             helpptr = sprites [ i ].back;
  200.             sprites [ i ].back = sprites [ i ].both;
  201.             sprites [ i ].both = helpptr;
  202.         }
  203.     for ( i = 0 ; i < 10 ; i ++ )
  204.         if ( sprites [ i ].visible )
  205.         {
  206.             x_get_pbm ( sprites [ i ].x, sprites [ i ].y, sprites [ i ].duz / 4,\
  207.                                     sprites [ i ].vis, HiddenPageOffs, sprites [ i ].back );
  208.             x_put_cbitmap ( sprites [ i ].x, sprites [ i ].y,\
  209.                                             HiddenPageOffs, sprites [ i ].sbmp );
  210.         }
  211.     x_page_flip ( 0, 0 );
  212.     delay ( delaytime );
  213.     return 1;
  214. }
  215.  
  216. int putsprite ( int spriteid, int x, int y )
  217. {
  218.     int duz, vis, ssize;
  219.  
  220.   duz = sprites [ spriteid ].duz;
  221.     vis = sprites [ spriteid ].vis;
  222.     if ( sprites [ spriteid ].visible )
  223.         return 0;
  224.     sprites [ spriteid ].x = sprites [ spriteid ].xoth = x;
  225.     sprites [ spriteid ].y = sprites [ spriteid ].yoth = y;
  226.     sprites [ spriteid ].newx = x;
  227.     sprites [ spriteid ].newy = y;
  228.     ssize = duz * vis + 2;
  229.     sprites [ spriteid ].back = (BYTE far *) farmalloc ( ssize );
  230.     sprites [ spriteid ].both = (BYTE far *) farmalloc ( ssize );
  231.     if ( sprites [ spriteid ].back == NULL || sprites [ spriteid ].both == NULL )
  232.         Terminate ( 2 );
  233.     x_get_pbm ( x, y, duz / 4, vis, VisiblePageOffs, sprites [ spriteid ].back );
  234.     x_get_pbm ( x, y, duz / 4, vis, HiddenPageOffs, sprites [ spriteid ].both );
  235.     x_put_cbitmap ( x, y, VisiblePageOffs, sprites [ spriteid ].sbmp );
  236.     x_put_cbitmap ( x, y, HiddenPageOffs, sprites [ spriteid ].sbmp );
  237.     sprites [ spriteid ].visible = 1;
  238.     return 1;
  239. }
  240.  
  241. void interrupt Timer ( void )
  242. {
  243.     if ( request != NULL )
  244.     {
  245.         inprogress = request;
  246.         request = NULL;
  247.         soundidx = 2;
  248.         pauseidx = 1;
  249.         nrsounds = *inprogress;
  250.         pausecount = 0;
  251.         soundsplayed = 0;
  252.         sound ( *(inprogress + soundidx) * 10 );
  253.         goto procend;
  254.     }
  255.     if ( inprogress != NULL )
  256.     {
  257.         pausecount ++ ;
  258.         if ( pausecount > *(inprogress + pauseidx) )
  259.         {
  260.             soundsplayed ++ ;
  261.             if ( soundsplayed > nrsounds )
  262.             {
  263.                 inprogress = NULL;
  264.                 nosound ( );
  265.                 goto procend;
  266.             }
  267.             soundidx += 2;
  268.             pauseidx += 2;
  269.             pausecount = 0;
  270.             sound ( *(inprogress + soundidx) * 10 );
  271.         }
  272.     }
  273.     procend:
  274.         oldtimer ( );
  275. }
  276.  
  277. void interrupt Keyboard_Handler ( void )
  278. {
  279.     int keypressed;
  280.     BYTE b1, b2;
  281.  
  282.     b1 = inportb ( 0x61 );
  283.     b2 = b1;
  284.     b1 |= 0x80;
  285.     outportb ( 0x61, b1 );
  286.     b1 = b2;
  287.     outportb ( 0x61, b1 );
  288.     outportb ( 0x20, 0x20 );
  289.     keypressed = inp ( 0x60 );
  290.     switch ( keypressed )
  291.     {
  292.         case 28: ENTER = 1;
  293.                          break;
  294.         case 156:ENTER = 0;
  295.                          break;
  296.         case 1:  ESC = 1;
  297.                          break;
  298.         case 129:ESC = 0;
  299.                          break;
  300.         case 77: RIGHT = 1;
  301.                          break;
  302.         case 205:RIGHT = 0;
  303.                          break;
  304.         case 75: LEFT = 1;
  305.                          break;
  306.         case 203:LEFT = 0;
  307.                          break;
  308.         case 225:outp ( 0x60, 15 );
  309.                          break;
  310.     }
  311. }
  312.  
  313. void New_Level ( void )
  314. {
  315.     int f, i;
  316.  
  317.     score -= scoredec;
  318.     scoredec = 0;
  319.   x_bgprintf ( 210, 20, VisiblePageOffs, 10, 4, "  %ld  ", score );
  320.     x_bgprintf ( 210, 20, HiddenPageOffs, 10, 4, "  %ld  ", score );
  321.     request = endlevel;
  322.     while ( inprogress != NULL )
  323.         ;
  324.     if ( level + 1 <= NrLevels )
  325.     {
  326.         Fade_Out_Palette ( );
  327.         level ++ ;
  328.         for ( i = 0 ; i < 10 ; i ++ )
  329.             sprites [ i ].newy = 205;
  330.         movesprites ( );
  331.         movesprites ( );
  332.         f = f_open ( lvlbkgs [ level - 1 ], F_RDONLY );
  333.         if ( f == FILE_ERR )
  334.             Terminate ( 1 );
  335.         x_file_RLDecode ( f, background );
  336.         f_close ( f );
  337.         x_put_pbm ( 0, 0, VisiblePageOffs, background );
  338.         x_put_pbm ( 0, 0, HiddenPageOffs, background );
  339.  
  340.         x_get_pbm ( 0, 70, 80, 60, VisiblePageOffs, background );
  341.         x_rect_pattern ( 0, 70, 319, 129, VisiblePageOffs, MK_FP ( _DS, uzorak ) );
  342.         x_bgprintf ( 140, 75, VisiblePageOffs, 1, 10, "Level %d", level );
  343.         x_bgprintf ( 110, 95, VisiblePageOffs, 1, 10, lvlnames [ level - 1 ] );
  344.         x_bgprintf ( 120, 115, VisiblePageOffs, 4, 12, "Hit <Enter> ..." );
  345.         Fade_In_Palette ( );
  346.         while ( !ENTER )
  347.         {
  348.             x_rot_pal_struc ( pal3, 1 );
  349.             x_put_pal_struc ( pal3 );
  350.             delay ( 50 );
  351.         }
  352.         x_put_pbm ( 0, 70, VisiblePageOffs, background );
  353.  
  354.         cornyx = 95; cornyy = 170;
  355.  
  356.         birdiex1 = 5; birdiey1 = 20;
  357.         birdiespt1 = 3;
  358.         birdiedir1 = 0;
  359.         birdiecount1 = 0;
  360.         vdir1 = 1;
  361.  
  362.         birdiex2 = 100; birdiey2 = 1;
  363.         birdiespt2 = 3;
  364.         birdiedir2 = 3;
  365.         birdiecount2 = 0;
  366.         vdir2 = 0;
  367.         if ( (level - 1) % 3 == 0 )
  368.         {
  369.             levelnorm = 50 + ((level - 1) / 3) * 10;
  370.             lvlprob = 250;
  371.             levelactive ++ ;
  372.             levelgoody += 2;
  373.             levelbady += 2;
  374.         }
  375.         else
  376.         {
  377.             if ( level != 12 )
  378.             {
  379.                 lvlprob += 250;
  380.                 levelnorm -= 10;
  381.             }
  382.             else
  383.             {
  384.                 lvlprob = 0;
  385.                 levelnorm = 100;
  386.             }
  387.         }
  388.     as [ 0 ] = 10; as [ 1 ] = 11; as [ 2 ] = 12;
  389.         as [ 3 ] = 13; as [ 4 ] = 14; as [ 5 ] = 15;
  390.         as [ 6 ] = 16;
  391.         jaws [ 0 ] = jaws [ 1 ] = jaws [ 2 ] = jaws [ 3 ] = 0;
  392.         jaws [ 4 ] = jaws [ 5 ] = jaws [ 6 ] = 0;
  393.     sprites [ 9 ].newy = cornyy;
  394.         sprites [ 9 ].newx = cornyx;
  395.         sprites [ 8 ].newy = birdiey2;
  396.         sprites [ 8 ].newx = birdiex2;
  397.         sprites [ 7 ].newy = birdiey1;
  398.         sprites [ 7 ].newx = birdiex1;
  399.         assignsprite ( 0, sbmps [ levelsprites [ levelgoody ] ] );
  400.         assignsprite ( 1, sbmps [ levelsprites [ levelgoody ] ] );
  401.         assignsprite ( 2, sbmps [ levelsprites [ levelgoody ] ] );
  402.         assignsprite ( 3, sbmps [ levelsprites [ levelgoody ] ] );
  403.         assignsprite ( 4, sbmps [ levelsprites [ levelgoody ] ] );
  404.         assignsprite ( 5, sbmps [ levelsprites [ levelgoody ] ] );
  405.         assignsprite ( 6, sbmps [ levelsprites [ levelgoody ] ] );
  406.         movesprites ( );
  407.         consec = 0;
  408.     x_bgprintf ( 210, 80, VisiblePageOffs, 10, 4, " %d ", level );
  409.         x_bgprintf ( 210, 80, HiddenPageOffs, 10, 4, " %d ", level );
  410.         x_bgprintf ( 210, 110, VisiblePageOffs, 10, 4, " %d ", levelnorm );
  411.         x_bgprintf ( 210, 110, HiddenPageOffs, 10, 4, " %d ", levelnorm );
  412.         levelparcels = 0;
  413.     }
  414.     else
  415.         gameend = 1;
  416. }
  417.  
  418. void Packets ( void )
  419. {
  420.     int i;
  421.     static int lastbird = 1;
  422.     BYTE new = 0;
  423.  
  424.     active = 0;
  425.     for ( i = 0 ; i < 7 ; i ++ )
  426.     {
  427.         if ( as [ i ] < 10 )
  428.         {
  429.             if ( collided ( as [ i ] ) )
  430.             {
  431.                 if ( !jaws [ i ] )
  432.                 {
  433.                     request = catch;
  434.                     consec = 0;
  435.                     levelparcels ++ ;
  436.                     sprites [ as [ i ] ].newy = 205;
  437.                     as [ i ] += 10;
  438.                     score += 100;
  439.                     new = 1;
  440.                     if ( levelparcels == levelnorm )
  441.                         New_Level ( );
  442.                 }
  443.                 else
  444.                 {
  445.                     request = lostlife;
  446.                     lives -- ;
  447.                     sprites [ as [ i ] ].newy = 205;
  448.                     assignsprite ( as [ i ], sbmps [ levelsprites [ levelgoody ] ] );
  449.                     jaws [ i ] = 0;
  450.                     as [ i ] += 10;
  451.                     new = 1;
  452.                 }
  453.             }
  454.             else
  455.                 if ( sprites [ as [ i ] ].y > 200 )
  456.                     if ( !jaws [ i ] )
  457.                     {
  458.                         request = fall;
  459.                         consec ++ ;
  460.                         sprites [ as [ i ] ].newy = 205;
  461.                         as [ i ] += 10;
  462.                         scoredec += 200;
  463.                     }
  464.                     else
  465.                     {
  466.                         sprites [ as [ i ] ].newy = 205;
  467.                         jaws [ i ] = 0;
  468.                         assignsprite ( as [ i ], sbmps [ levelsprites [ levelgoody ] ] );
  469.             as [ i ] += 10;
  470.                     }
  471.         }
  472.     }
  473.     if ( consec >= 2 )
  474.     {
  475.         request = lostlife;
  476.         lives -- ;
  477.         new = 1;
  478.         consec = 0;
  479.     }
  480.     for ( i = 0 ; i < 7 ; i ++ )
  481.         if ( as[ i ] < 10 )
  482.         {
  483.             sprites [ as [ i ] ].newy = 1 + sprites [ as [ i ] ].y;
  484.             active ++ ;
  485.         }
  486.     i = 0;
  487.     if ( active < levelactive )
  488.     {
  489.         while ( as [ i ] < 10 )
  490.             i ++ ;
  491.         as [ i ] -= 10;
  492.         if ( random ( 1000 ) < lvlprob )
  493.         {
  494.             jaws [ i ] = 1;
  495.             assignsprite ( as [ i ], sbmps [ levelsprites [ levelbady ] ] );
  496.         }
  497.         if ( lastbird == 2 )
  498.         {
  499.             sprites [ as [ i ] ].newx = birdiex1;
  500.             sprites [ as [ i ] ].newy = birdiey1 + 18;
  501.             lastbird = 1;
  502.         }
  503.         else
  504.         {
  505.             sprites [ as [ i ] ].newx = birdiex2;
  506.             sprites [ as [ i ] ].newy = birdiey2 + 18;
  507.             lastbird = 2;
  508.         }
  509.     }
  510.     if ( new )
  511.     {
  512.       x_bgprintf ( 210, 20, VisiblePageOffs, 10, 4, "  %ld  ", score );
  513.         x_bgprintf ( 210, 20, HiddenPageOffs, 10, 4, "  %ld  ", score );
  514.         x_bgprintf ( 210, 110, VisiblePageOffs, 10, 4, " %d ", levelnorm - levelparcels );
  515.         x_bgprintf ( 210, 110, HiddenPageOffs, 10, 4, " %d ", levelnorm - levelparcels );
  516.         x_bgprintf ( 210, 50, VisiblePageOffs, 10, 4, "%d", lives );
  517.         x_bgprintf ( 210, 50, HiddenPageOffs, 10, 4, "%d", lives );
  518.     }
  519. }
  520.  
  521. void Move_Birdie1 ( void )
  522. {
  523.     assignsprite ( 8, sbmps [ birdiespt1 + birdiedir1 ] );
  524.     if ( birdiedir1 )
  525.         if ( (birdiex1 > 5) && (random ( 1000 ) > 10) )
  526.             birdiex1 -- ;
  527.         else
  528.             birdiedir1 = 0;
  529.     else
  530.         if ( (birdiex1 < 180) && (random ( 1000 ) > 10) )
  531.             birdiex1 ++ ;
  532.         else
  533.             birdiedir1 = 3;
  534.  
  535.     if ( vdir1 )
  536.         if ( birdiey1 > 2 )
  537.             birdiey1 -= random ( 3 );
  538.         else
  539.             vdir1 = 0;
  540.     else
  541.         if ( birdiey1 < 30 )
  542.             birdiey1 += random ( 3 );
  543.         else
  544.             vdir1 = 1;
  545.  
  546.     sprites [ 8 ].newx = birdiex1;
  547.     sprites [ 8 ].newy = birdiey1;
  548.     birdiecount1 ++ ;
  549.     if ( birdiecount1 == 5 )
  550.     {
  551.         birdiespt1 ++ ;
  552.         birdiecount1 = 0;
  553.     }
  554.     if ( birdiespt1 > 4 )
  555.         birdiespt1 = 3;
  556. }
  557.  
  558. void Move_Birdie2 ( void )
  559. {
  560.     assignsprite ( 7, sbmps [ birdiespt2 + birdiedir2 ] );
  561.     if ( birdiedir2 )
  562.         if ( birdiex2 > 5 )
  563.             birdiex2 -- ;
  564.         else
  565.             birdiedir2 = 0;
  566.     else
  567.         if ( birdiex2 < 180 )
  568.             birdiex2 ++ ;
  569.         else
  570.             birdiedir2 = 3;
  571.  
  572.     if ( vdir2 )
  573.         if ( birdiey2 > 2 )
  574.             birdiey2 -= random ( 3 );
  575.         else
  576.             vdir2 = 0;
  577.     else
  578.         if ( birdiey2 < 30 )
  579.             birdiey2 += random ( 3 );
  580.         else
  581.             vdir2 = 1;
  582.  
  583.     sprites [ 7 ].newx = birdiex2;
  584.     sprites [ 7 ].newy = birdiey2;
  585.     birdiecount2 ++ ;
  586.     if ( birdiecount2 == 5 )
  587.     {
  588.         birdiespt2 ++ ;
  589.         birdiecount2 = 0;
  590.     }
  591.     if ( birdiespt2 > 4 )
  592.         birdiespt2 = 3;
  593. }
  594.  
  595. void Step_Corny_Right ( void )
  596. {
  597.     Move_Birdie1 ( );
  598.     Move_Birdie2 ( );
  599.     Packets ( );
  600.     assignsprite ( 9, sbmps [ 2 ] );
  601.     if ( cornyx < 188 )
  602.     {
  603.         cornyx += 2;
  604.         sprites [ 9 ].newx = cornyx;
  605.     }
  606.     movesprites ( );
  607.     Move_Birdie1 ( );
  608.     Move_Birdie2 ( );
  609.     Packets ( );
  610.     assignsprite ( 9, sbmps [ 0 ] );
  611.     if ( cornyx < 190 )
  612.     {
  613.         cornyx += 2;
  614.         sprites [ 9 ].newx = cornyx;
  615.     }
  616.     movesprites ( );
  617. }
  618.  
  619. void Step_Corny_Left ( void )
  620. {
  621.     Move_Birdie1 ( );
  622.     Move_Birdie2 ( );
  623.     Packets ( );
  624.     assignsprite ( 9, sbmps [ 1 ] );
  625.     if ( cornyx > 10 )
  626.     {
  627.         cornyx -= 2;
  628.         sprites [ 9 ].newx = cornyx;
  629.     }
  630.     movesprites ( );
  631.     Move_Birdie1 ( );
  632.     Move_Birdie2 ( );
  633.     Packets ( );
  634.     assignsprite ( 9, sbmps [ 0 ] );
  635.     if ( cornyx > 10 )
  636.     {
  637.         cornyx -= 2;
  638.         sprites [ 9 ].newx = cornyx;
  639.     }
  640.     movesprites ( );
  641. }
  642.  
  643. void Game_Over ( void )
  644. {
  645.     x_get_pbm ( 0, 70, 80, 60, VisiblePageOffs, background );
  646.     x_rect_pattern ( 0, 70, 319, 129, VisiblePageOffs, MK_FP ( _DS, uzorak ) );
  647.     x_bgprintf ( 140, 90, VisiblePageOffs, 1, 10, "Game Over" );
  648.     x_bgprintf ( 110, 105, VisiblePageOffs, 1, 10, "Score: %ld", score - scoredec );
  649.     x_bgprintf ( 120, 115, VisiblePageOffs, 4, 12, "Hit <Enter> ..." );
  650.     while ( !ENTER )
  651.     {
  652.         x_rot_pal_struc ( pal3, 1 );
  653.         x_put_pal_struc ( pal3 );
  654.         delay ( 50 );
  655.     }
  656.     x_put_pbm ( 0, 70, VisiblePageOffs, background );
  657. }
  658.  
  659. void Show_Must_Go_On ( void )
  660. {
  661.     while ( !ESC && lives > 0 && !gameend )
  662.     {
  663.         if ( RIGHT )
  664.         {
  665.             smjer = 1;
  666.             Step_Corny_Right ( );
  667.         }
  668.         else
  669.             if ( LEFT )
  670.             {
  671.                 smjer = 0;
  672.                 Step_Corny_Left ( );
  673.             }
  674.             else
  675.             {
  676.                 Move_Birdie1 ( );
  677.                 Move_Birdie2 ( );
  678.                 Packets ( );
  679.                 movesprites ( );
  680.             }
  681.     }
  682.     Game_Over ( );
  683. }
  684.  
  685. void Ready_And_Set ( void )
  686. {
  687.     int f, i;
  688.  
  689.     level = 1;
  690.     levelgoody = 0;
  691.     levelbady = 1;
  692.     levelnorm = 50;
  693.     request = inprogress = NULL;
  694.     for ( i = 0 ; i < 10 ; i ++ )
  695.         sprites [ i ].newy = 205;
  696.     movesprites ( );
  697.     movesprites ( );
  698.     gameend = 0;
  699.     srand ( 125 );
  700.     x_rect_fill ( 0, 0, 319, 199, VisiblePageOffs, 4 );
  701.     x_rect_fill ( 0, 0, 319, 199, HiddenPageOffs, 4 );
  702.     f = f_open ( "lvl1.bkg", F_RDONLY );
  703.   if ( f == FILE_ERR )
  704.         Terminate ( 2 );
  705.     x_file_RLDecode ( f, background );
  706.     f_close ( f );
  707.     x_put_pbm ( 0, 0, VisiblePageOffs, background );
  708.     x_put_pbm ( 0, 0, HiddenPageOffs, background );
  709.     x_register_userfont ( varswisl );
  710.     x_set_font ( 2 );
  711.     x_bgprintf ( 210, 10, VisiblePageOffs, 10, 1, "Score" );
  712.     x_bgprintf ( 210, 10, HiddenPageOffs, 10, 1, "Score" );
  713.     x_bgprintf ( 210, 40, VisiblePageOffs, 10, 1, "Lives" );
  714.     x_bgprintf ( 210, 40, HiddenPageOffs, 10, 1, "Lives" );
  715.     x_bgprintf ( 210, 70, VisiblePageOffs, 10, 1, "Level" );
  716.     x_bgprintf ( 210, 70, HiddenPageOffs, 10, 1, "Level" );
  717.     x_bgprintf ( 210, 100, VisiblePageOffs, 10, 1, "Counter" );
  718.     x_bgprintf ( 210, 100, HiddenPageOffs, 10, 1, "Counter" );
  719.     x_set_font ( 0 );
  720.     x_bgprintf ( 210, 20, VisiblePageOffs, 10, 4, "0" );
  721.     x_bgprintf ( 210, 20, HiddenPageOffs, 10, 4, "0" );
  722.     x_bgprintf ( 210, 50, VisiblePageOffs, 10, 4, "3" );
  723.     x_bgprintf ( 210, 50, HiddenPageOffs, 10, 4, "3" );
  724.     x_bgprintf ( 210, 80, VisiblePageOffs, 10, 4, "1" );
  725.     x_bgprintf ( 210, 80, HiddenPageOffs, 10, 4, "1" );
  726.     x_bgprintf ( 210, 110, VisiblePageOffs, 10, 4, " 50 " );
  727.     x_bgprintf ( 210, 110, HiddenPageOffs, 10, 4, " 50 " );
  728.     x_get_pbm ( 0, 70, 80, 60, VisiblePageOffs, background );
  729.     x_rect_pattern ( 0, 70, 319, 129, VisiblePageOffs, MK_FP ( _DS, uzorak ) );
  730.     x_bgprintf ( 140, 75, VisiblePageOffs, 1, 10, "Level %d", level );
  731.     x_bgprintf ( 110, 95, VisiblePageOffs, 1, 10, lvlnames [ level - 1 ] );
  732.     x_bgprintf ( 120, 115, VisiblePageOffs, 4, 12, "Hit <Enter> ..." );
  733.     while ( !ENTER )
  734.     {
  735.         x_rot_pal_struc ( pal3, 1 );
  736.         x_put_pal_struc ( pal3 );
  737.         delay ( 50 );
  738.     }
  739.     x_put_pbm ( 0, 70, VisiblePageOffs, background );
  740.  
  741.   cornyx = 95; cornyy = 170;
  742.  
  743.     birdiex1 = 5; birdiey1 = 20;
  744.     birdiespt1 = 3;
  745.     birdiedir1 = 0;
  746.     birdiecount1 = 0;
  747.     vdir1 = 1;
  748.  
  749.     birdiex2 = 100; birdiey2 = 1;
  750.     birdiespt2 = 3;
  751.     birdiedir2 = 3;
  752.     birdiecount2 = 0;
  753.     vdir2 = 0;
  754.  
  755.     consec = 0;
  756.     lives = 3;
  757.     score = 0L;
  758.     scoredec = 0;
  759.     levelparcels = 0;
  760.     lvlprob = 250;
  761.     levelactive = 3;
  762.  
  763.   as [ 0 ] = 10; as [ 1 ] = 11; as [ 2 ] = 12;
  764.     as [ 3 ] = 13; as [ 4 ] = 14; as [ 5 ] = 15;
  765.     as [ 6 ] = 16;
  766.     jaws [ 0 ] = jaws [ 1 ] = jaws [ 2 ] = jaws [ 3 ] = 0;
  767.     jaws [ 4 ] = jaws [ 5 ] = jaws [ 6 ] = 0;
  768.  
  769.     assignsprite ( 0, sbmps [ 9 ] );
  770.     assignsprite ( 1, sbmps [ 9 ] );
  771.     assignsprite ( 2, sbmps [ 9 ] );
  772.     assignsprite ( 3, sbmps [ 9 ] );
  773.     assignsprite ( 4, sbmps [ 9 ] );
  774.     assignsprite ( 5, sbmps [ 9 ] );
  775.     assignsprite ( 6, sbmps [ 9 ] );
  776.     sprites [ 9 ].newy = cornyy;
  777.     sprites [ 9 ].newx = cornyx;
  778.     sprites [ 8 ].newy = birdiey2;
  779.     sprites [ 8 ].newx = birdiex2;
  780.     sprites [ 7 ].newy = birdiey1;
  781.     sprites [ 7 ].newx = birdiex1;
  782.     movesprites ( );
  783.     Show_Must_Go_On ( );
  784.     ESC = LEFT = RIGHT = ENTER = 0;
  785. }
  786.  
  787. void Load_Sprites ( void )
  788. {
  789.     int f, i;
  790.  
  791.     f = f_open ( "corny.spr", F_RDONLY );
  792.     if ( f == FILE_ERR )
  793.         Terminate ( 1 );
  794.     f_seek ( f, 1L, SEEK_CURR );
  795.     for ( i = 0 ; i < 15 ; i ++ )
  796.     {
  797.         f_readfar ( f, MK_FP ( _DS, (unsigned) &xsz ), 1 );
  798.         f_readfar ( f, MK_FP ( _DS, (unsigned) &ysz ), 1 );
  799.         f_readfar ( f, MK_FP ( _DS, (unsigned) &sz ), 2 );
  800.         sbmps [ i ] = (char far *) farmalloc ( sz + 2 );
  801.         if ( sbmps [ i ] == NULL )
  802.             Terminate ( 2 );
  803.         *sbmps [ i ] = xsz;
  804.         *(sbmps [ i ] + 1) = ysz;
  805.         f_readfar ( f, sbmps [ i ] + 2, sz );
  806.     }
  807.     f_close ( f );
  808. }
  809.  
  810. void Load_Fonts ( void )
  811. {
  812.     int f;
  813.  
  814.     varswisl = (char far *) farmalloc ( 964 );
  815.     if ( varswisl == NULL )
  816.         Terminate ( 2 );
  817.     f = f_open ( "varswisl.fnt", F_RDONLY );
  818.     if ( f == FILE_ERR )
  819.         Terminate ( 1 );
  820.     f_readfar ( f, varswisl, 964 );
  821.     f_close ( f );
  822. }
  823.  
  824. void Load_High_Scores ( void )
  825. {
  826.     int f, i;
  827.  
  828.     f = f_open ( "hi.sc", F_RDONLY );
  829.     if ( f == FILE_ERR )
  830.     {
  831.         for ( i = 0 ; i < 10 ; i ++ )
  832.         {
  833.             strcpy ( hiscores [ i ].name, "Fenoman" );
  834.             hiscores [ i ].hisc = 10000L;
  835.             hiscores [ i ].l = 6;
  836.         }
  837.     }
  838.     else
  839.     {
  840.         for ( i = 0 ; i < 10 ; i ++ )
  841.             f_readfar ( f, MK_FP ( _DS, &hiscores [ i ] ), 26 );
  842.         f_close ( f );
  843.     }
  844. }
  845.  
  846. void Save_High_Scores ( void )
  847. {
  848.     int f, i;
  849.  
  850.     f = f_open ( "hi.sc", F_WRONLY );
  851.     for ( i = 0 ; i < 10 ; i ++ )
  852.         f_writefar ( f, MK_FP ( _DS, &hiscores [ i ] ), 26 );
  853.     f_close ( f );
  854. }
  855.  
  856. void readstring ( int x, int y, int nr, char *str )
  857. {
  858.   int ch = 0, nch = 0, xcc, ycc, iter = 0, vis = 1;
  859.  
  860.   xcc = x;
  861.   ycc = y;
  862.     x_bgprintf ( xcc, ycc, VisiblePageOffs, 5, 10, "_" );
  863.   while ( ch != 13 )
  864.   {
  865.         while ( !kbhit ( ) )
  866.         {
  867.             x_rot_pal_struc ( pal2, 1 );
  868.             x_put_pal_struc ( pal2 );
  869.             iter ++ ;
  870.             if ( iter >= 500 )
  871.             {
  872.                 iter = 0;
  873.                 if ( vis )
  874.                 {
  875.                     vis = 0;
  876.                     x_bgprintf ( xcc, ycc, VisiblePageOffs, 5, 10, " " );
  877.                 }
  878.                 else
  879.                 {
  880.                     vis = 1;
  881.                     x_bgprintf ( xcc, ycc, VisiblePageOffs, 5, 10, "_" );
  882.                 }
  883.             }
  884.         }
  885.         ch = getch ( );
  886.         if ( ch == 0 && nch > 0 )
  887.         {
  888.             getch ( );
  889.             x_bgprintf ( xcc, ycc, VisiblePageOffs, 5, 10, " " );
  890.             x_bgprintf ( xcc - 6, ycc, VisiblePageOffs, 5, 10, "_" );
  891.             nch -- ;
  892.             xcc -= 6;
  893.             continue;
  894.         }
  895.         if ( ch == 0 && nch == 0 )
  896.         {
  897.             getch ( );
  898.             continue;
  899.         }
  900.         if ( nch < nr && ch != 13 )
  901.         {
  902.             *(str + nch) = ch;
  903.             nch ++ ;
  904.             x_bgprintf ( xcc, ycc, VisiblePageOffs, 5, 10, "%c", ch );
  905.             x_bgprintf ( xcc + 6, ycc, VisiblePageOffs, 5, 10, "_" );
  906.             xcc += 6;
  907.         }
  908.     }
  909.     *(str + nch) = '\0';
  910.     x_bgprintf ( xcc, ycc, VisiblePageOffs, 5, 10, " " );
  911. }
  912.  
  913. void High_Scores ( void )
  914. {
  915.     int i, j, y = 9, w = 8;
  916.     BYTE newhisc = 0;
  917.  
  918.     nosound ( );
  919.     score -= scoredec;
  920.     j = 0;
  921.     for ( i = 0 ; i < 201 ; i ++ )
  922.     {
  923.         x_line ( 0, i, 319, i, j, VisiblePageOffs );
  924.         j ++ ;
  925.         if ( j == 16 )
  926.             j = 0;
  927.     }
  928.     if ( score > hiscores [ 9 ].hisc )
  929.     {
  930.         newhisc = 1;
  931.         while ( hiscores [ w ].hisc <= score && w > -1 )
  932.         {
  933.             hiscores [ y ].hisc = hiscores [ w ].hisc;
  934.             hiscores [ y ].l = hiscores [ w ].l;
  935.             for ( i = 0 ; i < 20 ; i ++ )
  936.                 hiscores [ y ].name [ i ] = hiscores [ w ].name [ i ];
  937.             y -- ;
  938.             w -- ;
  939.         }
  940.         hiscores [ y ].hisc = score;
  941.         hiscores [ y ].l = level;
  942.     }
  943.     x_bgprintf ( 106, 10, VisiblePageOffs, 1, 9, "Top Goodie Pickers" );
  944.     x_bgprintf ( 100, 30, VisiblePageOffs, 3, 11, "Name" );
  945.     x_bgprintf ( 200, 30, VisiblePageOffs, 3, 11, "Score" );
  946.     x_bgprintf ( 260, 30, VisiblePageOffs, 3, 11, "Level" );
  947.     for ( i = 0 ; i < 10 ; i ++ )
  948.     {
  949.         x_bgprintf ( 10, 40 + 12 * i, VisiblePageOffs, 5, 10, "%d.", i + 1 );
  950.         if ( !newhisc )
  951.             x_bgprintf ( 30, 40 + 12 * i, VisiblePageOffs, 5, 10, hiscores [ i ].name );
  952.         else
  953.             if ( i != y )
  954.                 x_bgprintf ( 30, 40 + 12 * i, VisiblePageOffs, 5, 10, hiscores [ i ].name );
  955.         x_bgprintf ( 190, 40 + 12 * i, VisiblePageOffs, 5, 10, "%ld", hiscores [ i ].hisc );
  956.         x_bgprintf ( 280, 40 + 12 * i, VisiblePageOffs, 5, 10, "%d", hiscores [ i ].l );
  957.     }
  958.     if ( newhisc )
  959.         readstring ( 30, 40 + 12 * y, 19, hiscores [ y ].name );
  960.     while ( 1 )
  961.     {
  962.         x_rot_pal_struc ( pal2, 1 );
  963.         x_put_pal_struc ( pal2 );
  964.         delay ( 50 );
  965.         if ( kbhit ( ) )
  966.             if ( getch ( ) == 13 )
  967.                 break;
  968.     }
  969.     x_put_pal_struc ( pal1 );
  970. }
  971.  
  972. void Scroll ( int flag )
  973. {
  974.     static int emptyspaces = 0;
  975.     static int cchar = -1;
  976.     int i;
  977.  
  978.     if ( flag )
  979.     {
  980.         emptyspaces = 0;
  981.         cchar = -1;
  982.     }
  983.     cchar ++ ;
  984.     if ( *(credits + cchar) == '\0' )
  985.     {
  986.         emptyspaces ++ ;
  987.         cchar -- ;
  988.         if ( emptyspaces == 80 )
  989.         {
  990.             cchar = -1;
  991.             emptyspaces = 0;
  992.         }
  993.         for ( i = 0 ; i < 7 ; i ++ )
  994.         {
  995.             x_get_pbm ( 7 - i, 0, 78, 8, VisiblePageOffs, background );
  996.             x_put_pbm ( 7 - i - 1, 0, VisiblePageOffs, background );
  997.         }
  998.         x_bgprintf ( 311, 0, VisiblePageOffs, 1, 9, " " );
  999.     }
  1000.     else
  1001.     {
  1002.     for ( i = 0 ; i < 7 ; i ++ )
  1003.         {
  1004.             x_get_pbm ( 7 - i, 0, 78, 8, VisiblePageOffs, background );
  1005.             x_put_pbm ( 7 - i - 1, 0, VisiblePageOffs, background );
  1006.         }
  1007.         x_bgprintf ( 311, 0, VisiblePageOffs, 1, 9, "%c", *(credits + cchar) );
  1008.     }
  1009. }
  1010.  
  1011. int Opening_Screen ( void )
  1012. {
  1013.     int c, f;
  1014.  
  1015.     Fade_Out_Palette ( );
  1016.     x_set_font ( 0 );
  1017.     f = f_open ( "title.scr", F_RDONLY );
  1018.     if ( f == FILE_ERR )
  1019.         Terminate( 1 );
  1020.     x_file_RLDecode ( f, background );
  1021.     f_close ( f );
  1022.     x_put_pbm ( 0, 0, VisiblePageOffs, background );
  1023.     x_bgprintf ( 104, 180, VisiblePageOffs, 10, 4, "P)lay or E)xit" );
  1024.     Fade_In_Palette ( );
  1025.     while ( kbhit ( ) )
  1026.         getch ( );
  1027.     Scroll ( 1 );
  1028.     while ( 1 )
  1029.     {
  1030.         while ( !kbhit ( ) )
  1031.             Scroll ( 0 );
  1032.         c = getch ( );
  1033.         if ( c == 'p' || c == 'P' )
  1034.             return 1;
  1035.         if ( c == 'e' || c == 'E' )
  1036.             return 0;
  1037.     }
  1038.     return 1;
  1039. }
  1040.  
  1041. void Initialize ( void )
  1042. {
  1043.     x_get_pal_struc ( pal1, 16, 0 );
  1044.     x_get_pal_struc ( pal3, 4, 32 );
  1045.     Load_High_Scores ( );
  1046.     assignsprite ( 0, sbmps [ 9 ] );
  1047.     assignsprite ( 1, sbmps [ 9 ] );
  1048.     assignsprite ( 2, sbmps [ 9 ] );
  1049.     assignsprite ( 3, sbmps [ 9 ] );
  1050.     assignsprite ( 4, sbmps [ 9 ] );
  1051.     assignsprite ( 5, sbmps [ 9 ] );
  1052.     assignsprite ( 6, sbmps [ 9 ] );
  1053.     assignsprite ( 7, sbmps [ 6 ] );
  1054.     assignsprite ( 8, sbmps [ 3 ] );
  1055.     assignsprite ( 9, sbmps [ 0 ] );
  1056.     putsprite ( 9, 0, 205 );                        /*ptica1*/
  1057.     putsprite ( 8, 20, 205 );           /*ptica2*/
  1058.     putsprite ( 7, 50, 205 );                   /*corny*/
  1059.     putsprite ( 6, 80, 205 );                  /*paketi*/
  1060.     putsprite ( 5, 110, 205 );
  1061.     putsprite ( 4, 20, 205 );
  1062.     putsprite ( 3, 50, 205 );
  1063.     putsprite ( 2, 140, 205 );
  1064.     putsprite ( 1, 170, 205 );
  1065.     putsprite ( 0, 200, 205 );
  1066. }
  1067.  
  1068. main ( int argc, char *argv [ ] )
  1069. {
  1070.     int i;
  1071.  
  1072.     delay ( 10 );
  1073.     delaytime = 0;
  1074.     if ( argc > 1 )
  1075.         delaytime = atoi ( argv [ 1 ] );
  1076.     Load_Sprites ( );
  1077.     Load_Fonts ( );
  1078.     keybuffb = MK_FP ( 0, 0x41c );
  1079.     keybuffe = MK_FP ( 0, 0x41e );
  1080.     background = (BYTE far *) farmalloc ( 64002 );
  1081.     pal1 = (BYTE far *) farmalloc ( 20 * 3 + 2 );
  1082.     pal2 = (BYTE far *) farmalloc ( 20 * 3 + 2 );
  1083.     pal3 = (BYTE far *) farmalloc ( 10 * 3 + 2 );
  1084.     if ( background == NULL || pal1 == NULL || pal2 == NULL || pal3 == NULL )
  1085.         Terminate ( 1 );
  1086.     x_set_mode ( X_MODE_320x200, 320 );
  1087.     x_set_doublebuffer ( 250 );
  1088.     x_text_init ( );
  1089.     Initialize ( );
  1090.     oldtimer = getvect ( 0x08 );
  1091.   setvect ( 0x08, Timer );
  1092.     while ( Opening_Screen ( ) )
  1093.     {
  1094.         old09 = getvect ( 0x09 );
  1095.         setvect ( 0x09, Keyboard_Handler );
  1096.         Ready_And_Set ( );
  1097.         setvect ( 0x09, old09 );
  1098.         High_Scores ( );
  1099.     }
  1100.     nosound ( );
  1101.   setvect ( 0x08, oldtimer );
  1102.     x_text_mode ( );
  1103.     Save_High_Scores ( );
  1104.     for ( i = 0 ; i < 6 ; i ++ )
  1105.         farfree ( sbmps [ i ] );
  1106.     farfree ( varswisl );
  1107.     farfree ( background );
  1108.     farfree ( titlescr );
  1109.     farfree ( pal1 );
  1110.     farfree ( pal2 );
  1111.     return 0;
  1112. }